package com.example.jetpacker.livedata

import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.alibaba.android.arouter.facade.annotation.Route
import com.example.jetpacker.R
import com.example.jetpacker.databinding.ActLivedataBinding

/**
 * LiveData内部不会判断即将设置的数据和原有数据是否相同，只要调用了setValue()或postValue()方法，就一定会触发数据变化事件。
 * LiveData在内部使用了Lifecycles组件来自我感知生命周期的变化，从而可以在Activity销毁的时候及时释放引用，避免产生内存泄漏的问题。
 * 当Activity处于不可见状态的时候（比如手机息屏，或者被其他的Activity遮挡），如果LiveData中的数据发生了变化，是不会通知给观察者的。
 * 只有当Activity重新恢复可见状态时，才会将数据通知给观察者，而LiveData之所以能够实现这种细节的优化，依靠的还是Lifecycles组件。
 * 当Activity恢复可见状态时，只有最新的那份数据才会通知给观察者，前面的数据在这种情况下相当于已经过期了，会被直接丢弃。
 */
@Route(path = "/jetpack/livedata")
class LivedataActivity : AppCompatActivity() {

    private lateinit var mBinding: ActLivedataBinding
    private lateinit var mViewModel: LivedataViewModel
    private lateinit var sp: SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.act_livedata)
        sp = getSharedPreferences("ApiTest", Context.MODE_PRIVATE)
        val countReserved = sp.getInt("count_reserved", 0)
        mViewModel = ViewModelProvider(this).get(LivedataViewModel::class.java)
        mViewModel.counter.value=countReserved
        mViewModel.counter.observe(this, {
            mBinding.tvText.text = it.toString()
        })
        mBinding.button.setOnClickListener {
            mViewModel.plusOne()
        }
        mBinding.btnClear.setOnClickListener {
            mViewModel.clear()
        }
    }

    override fun onPause() {
        super.onPause()
        sp.edit().putInt("count_reserved", mViewModel.counter.value ?: 0).apply()
    }
}